<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 工厂模式 构造函数 ---》类 ----》生成对象的；
      // 1.注意：表示类的函数 约定俗成 首字母大写； 为了和普通的函数区分一下；
      // 工厂模式

      /* 
            let obj = new Object();
            let str = new String();
            let arr = new Array();
        */

      // let obj = {
      //     name:"张三",
      //     age:20,
      //     showNameAge(){
      //         // console.log("姓名是："+obj.name+"年龄是"+obj.age);
      //         console.log("姓名是："+this.name+"年龄是"+this.age);
      //     }
      // }
      // obj.showNameAge();

      // 工厂模式
      // function Person(name){
      //     let obj = {};
      //     obj.name = name;
      //     obj.fn = function(){
      //         console.log("fn");
      //         console.log(this);
      //     }
      //     return obj;
      // }

      // let zhangsan  = Person("张三");
      // zhangsan.fn();

      // 注意：1.构造函数里的this指向实例化之后的对象
      // 2.会把属性放在构造函数内部 把方法放在构造函数的原型上；
      // 构造函数；
      function Person(name) {
        this.name = name;
        // this.fn = function(){
        //     console.log("fn");
        //     // console.log(this);
        //     console.log("名字是"+this.name);
        // }
      }
      Person.prototype.fn = function () {
        console.log("fn");
        console.log("名字是" + this.name);
      };

      let zhangsan = new Person("张三"); //new就是实例化
      zhangsan.fn();

      let lisi = new Person("李四");
      lisi.fn();
      console.log(zhangsan.fn === lisi.fn);

      // 总结：1.首字母大写  2. this的指向问题  3. 属性和方法放置问题；
    </script>
  </body>
</html>
